//
//  errors.swift
//  swift_ example
//
//  Created by 魏熙美 on 2020/2/21.
//  Copyright © 2020 魏熙美. All rights reserved.
//

import Foundation

// 5.错误处理 =====================================================

// 定义一个错误类型
enum UserError: Error{
    case invMessage
    // 可以接收错误信息
    case message(msg: String)
}

let userName = "weiximei"

// 表示可以这个函数可以跑出一个异常
func canThrowAnError() throws -> String? {
    // 你的代码逻辑
    
    // guard 表示提前退出并抛出错误
    // 如果语句是被 guard 修饰的语句, 并且里面还是 throw 抛出错误行为
    // 就表示只有所有的 guard 语句复合条件才能成功继续执行，否则交出程序控制权
    guard userName == "" else {
        throw UserError.message(msg: "未输入用户信息")
    }
    
    guard userName == "zhangsan" else {
        throw UserError.message(msg: "这个账号被锁定")
    }
    
    if userName != "weiximei" {
        throw UserError.message(msg: "用户不存在")
    }
    
    return "weiximei"
}

// 获取用户名
func getUserName() -> String? {
    
    // 这个函数表示可选的，当所有的都出现错误，这个函数返回值则为 nil

    // 如果没出错则返回当前的值
    if let userName1 = try? canThrowAnError() { return userName1 }
    if let userName2 = try? canThrowAnError() { return userName2 }
    
    // 如果上面两句都出现错误，则会返回 nil
    return nil
}


func tryErro() {
//    如果函数可能发生异常，可在 do...catch... 里面包裹
//    如果异常同时满足了多个 catch 块，则会协同处理(也就是多个catch都会执行)
   do {
       // try 表示 canThrowAnError 函数可能会跑出一个异常
       // try canThrowAnError()
    
    // 如果存在可选返回值
    if let name = try canThrowAnError() {
       print(name)
    }
   } catch UserError.invMessage {
       // 错误处理
       print("未知错误")
   } catch UserError.message(let msg) {
       // 错误处理
       // msg 可以接收到抛出的自定义信息
       print("打印错误信息：\(msg)")
   } catch {
       // 加入一个空 catch 用于关闭 catch
   }

}
